<!DOCTYPE html>
<html lang="zh-cn"><head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    
    <link href="/css/bootstrap.min.css" rel="stylesheet">
    <link href="/css/main.css" rel="stylesheet">

    <link rel="shortcut icon" type="image/x-icon" href="/img/favicon.ico" />

    <title>systemd的服务管理程序systemctl | wiseAI的小站</title>
</head><body><div class="container-fluid">
    <nav class="navbar fixed-top navbar-expand-sm navbar-dark bg-dark">
        <div class="container-fluid">
            <a class="navbar-brand" href="/">
                <img src="/img/favicon.ico" alt="" width="30" height="24" class="d-inline-block align-text-top">
                wiseAI的小站
            </a>
            <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
                <span class="navbar-toggler-icon"></span>
            </button>
            <div class="collapse navbar-collapse" id="navbarSupportedContent">
                <ul class="navbar-nav me-auto mb-2 mb-lg-0">
                    
                    <li class="nav-item">
                        <a  class="nav-link"   href="/articles/">文章</a>
                    </li>
                    
                    <li class="nav-item">
                        <a  class="nav-link"   href="/categories/">分类</a>
                    </li>
                    
                    <li class="nav-item">
                        <a  class="nav-link"   href="/tags/">关键字</a>
                    </li>
                    
                    <li class="nav-item">
                        <a  class="nav-link"   href="/post/golang/">golang编程</a>
                    </li>
                    
                    <li class="nav-item">
                        <a  class="nav-link"   href="/about/">关于</a>
                    </li>
                    
                </ul>
                <form class="d-flex">
                    <input id="search-query" class="form-control me-2" type="search" placeholder="Search for anything..." aria-label="Search">
                </form>
            </div>
        </div>
    </nav>
</div>




<div id="content">
<div class="container article">
	<h1>systemd的服务管理程序systemctl</h1>
	<div class="post-meta">
		<div>
			
			
			By wiseai | 2022-06-10 | 2 minutes
		</div>
		<div class="tags">
			
			<a class="btn btn-light links btn-sm" href="/tags/%E6%9C%8D%E5%8A%A1/">服务</a>
			
			<a class="btn btn-light links btn-sm" href="/tags/%E7%AE%A1%E7%90%86/">管理</a>
			
		</div>
	</div>
	<div>
		<div class="article-post">
			<p>systemctl融合service和chkconfig的功能于一体,可以使用它永久性或只在当前会话中启用/禁用服务。</p>
<h2 id="一启动关闭启用禁用服务">一、启动/关闭、启用/禁用服务</h2>
<p>运行一个服务：</p>
<p><code>#systemctl start firewalld</code></p>
<p>关闭一个服务：</p>
<p><code>#systemctl stop firewalld</code></p>
<p>重启一个服务:</p>
<p><code>#systemctl restart firewalld</code></p>
<p>显示一个服务（无论运行与否）的状态:</p>
<p><code>#systemctl status firewalld</code></p>
<p>在开机时启用一个服务：</p>
<p><code>#systemctl enable firewalld</code></p>
<p>在开机时禁用一个服务:</p>
<p><code>#systemctl disable firewalld</code></p>
<p>检查一个服务是否是开机启用：</p>
<p><code>#systemctl is-enabled firewalld</code></p>
<h2 id="二改变运行级别">二、改变运行级别</h2>
<p>切换到运行级别3或者5：</p>
<p><code>#systemctl isolate multi-user.target</code></p>
<p><code>#systemctl isolate graphical.target</code></p>
<p>改变默认运行级别3或者5：</p>
<p><code>#ln -sf /lib/systemd/system/multi-user.target /etc/systemd/system/default.target或#systemctl set-default multi-user.target</code></p>
<p><code>#ln -sf /lib/systemd/system/graphical.target /etc/systemd/system/default.target或#systemctl set-default graphical.target</code></p>
<p>查看当下运行级别:</p>
<p><code>#systemctl list-units --type=target</code></p>
<h2 id="三改变默认-getty-数目">三、改变默认 getty 数目</h2>
<p>添加一个新的 getty ：</p>
<pre tabindex="0"><code>#ln -sf /lib/systemd/system/getty@.service /etc/systemd/system/getty.target.wants/getty@tty9.service
#systemctl daemon-reload
#systemctl start getty@tty9.service`
</code></pre><p>删除一个 getty ：</p>
<pre tabindex="0"><code>#rm /etc/systemd/system/getty.target.wants/getty@tty9.service
#systemctl daemon-reload
#systemctl stop getty@tty9.service
</code></pre><h2 id="四读懂配置文件">四、读懂配置文件</h2>
<p>一个服务怎么启动，完全由它的配置文件决定。下面就来看，配置文件有些什么内容。</p>
<p>前面说过，配置文件主要放在<code>/usr/lib/systemd/system</code>目录，也可能在<code>/etc/systemd/system</code>目录。找到配置文件以后，使用文本编辑器打开即可。</p>
<p><code>systemctl cat</code>命令可以用来查看配置文件，下面以<code>sshd.service</code>文件为例，它的作用是启动一个 SSH 服务器，供其他用户以 SSH 方式登录。</p>
<blockquote>
<p>$ systemctl cat sshd.service</p>
<pre><code>[Unit]
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.service
Wants=sshd-keygen.service

[Service]
EnvironmentFile=/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D &lt;span class=&quot;hljs-variable&quot;&gt;$OPTIONS
ExecReload=/bin/kill -HUP &lt;span class=&quot;hljs-variable&quot;&gt;$MAINPID
Type=simple
KillMode=process
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target
</code></pre>
</blockquote>
<p>可以看到，配置文件分成几个区块，每个区块包含若干条键值对。</p>
<p>下面依次解释每个区块的内容。</p>
<h2 id="五-unit-区块启动顺序与依赖关系">五、 [Unit] 区块：启动顺序与依赖关系。</h2>
<p><code>Unit</code>区块的<code>Description</code>字段给出当前服务的简单描述，<code>Documentation</code>字段给出文档位置。</p>
<p>接下来的设置是启动顺序和依赖关系，这个比较重要。</p>
<blockquote>
<p><code>After</code>字段：表示如果<code>network.target</code>或<code>sshd-keygen.service</code>需要启动，那么<code>sshd.service</code>应该在它们之后启动。
相应地，还有一个<code>Before</code>字段，定义<code>sshd.service</code>应该在哪些服务之前启动。</p>
</blockquote>
<p>注意，<code>After</code>和<code>Before</code>字段只涉及启动顺序，不涉及依赖关系。</p>
<p>举例来说，某 Web 应用需要 postgresql 数据库储存数据。在配置文件中，它只定义要在 postgresql 之后启动，而没有定义依赖 postgresql 。上线后，由于某种原因，postgresql 需要重新启动，在停止服务期间，该 Web 应用就会无法建立数据库连接。</p>
<p>设置依赖关系，需要使用<code>Wants</code>字段和<code>Requires</code>字段。</p>
<blockquote>
<p><code>Wants</code>字段：表示<code>sshd.service</code>与<code>sshd-keygen.service</code>之间存在&quot;弱依赖&quot;关系，即如果&quot;sshd-keygen.service&quot;启动失败或停止运行，不影响<code>sshd.service</code>继续执行。
<code>Requires</code>字段则表示&quot;强依赖&quot;关系，即如果该服务启动失败或异常退出，那么<code>sshd.service</code>也必须退出。</p>
</blockquote>
<p>注意，<code>Wants</code>字段与<code>Requires</code>字段只涉及依赖关系，与启动顺序无关，默认情况下是同时启动的。</p>
<h2 id="六service-区块启动行为">六、[Service] 区块：启动行为</h2>
<p><code>Service</code>区块定义如何启动当前服务。</p>
<h3 id="61-启动命令">6.1 启动命令</h3>
<p>许多软件都有自己的环境参数文件，该文件可以用<code>EnvironmentFile</code>字段读取。</p>
<blockquote>
<p><code>EnvironmentFile</code>字段：指定当前服务的环境参数文件。该文件内部的<code>key=value</code>键值对，可以用<code>$key</code>的形式，在当前配置文件中获取。
上面的例子中，sshd 的环境参数文件是<code>/etc/sysconfig/sshd</code>。</p>
</blockquote>
<p>配置文件里面最重要的字段是<code>ExecStart</code>。</p>
<blockquote>
<p><code>ExecStart</code>字段：定义启动进程时执行的命令。
上面的例子中，启动<code>sshd</code>，执行的命令是<code>/usr/sbin/sshd -D $OPTIONS</code>，其中的变量<code>$OPTIONS</code>就来自<code>EnvironmentFile</code>字段指定的环境参数文件。</p>
</blockquote>
<p>与之作用相似的，还有如下这些字段。</p>
<blockquote>
<ul>
<li><code>ExecReload</code>字段：重启服务时执行的命令</li>
<li><code>ExecStop</code>字段：停止服务时执行的命令</li>
<li><code>ExecStartPre</code>字段：启动服务之前执行的命令</li>
<li><code>ExecStartPost</code>字段：启动服务之后执行的命令</li>
<li><code>ExecStopPost</code>字段：停止服务之后执行的命令
请看下面的例子。</li>
</ul>
</blockquote>
<blockquote>
<pre><code>[Service]
ExecStart=/bin/echo execstart1
ExecStart=
ExecStart=/bin/echo execstart2
ExecStartPost=/bin/echo post1
ExecStartPost=/bin/echo post2
</code></pre>
</blockquote>
<p>上面这个配置文件，第二行<code>ExecStart</code>设为空值，等于取消了第一行的设置，运行结果如下。</p>
<blockquote>
<p><span class="hljs-attribute">execstart2
post1
post2
所有的启动设置之前，都可以加上一个连词号（<code>-</code>），表示&quot;抑制错误&quot;，即发生错误的时候，不影响其他命令的执行。比如，<code>EnvironmentFile=-/etc/sysconfig/sshd</code>（注意等号后面的那个连词号），就表示即使<code>/etc/sysconfig/sshd</code>文件不存在，也不会抛出错误。</p>
</blockquote>
<h3 id="62-启动类型">6.2 启动类型</h3>
<p><code>Type</code>字段定义启动类型。它可以设置的值如下。</p>
<blockquote>
<ul>
<li>
<p>simple（默认值）：<code>ExecStart</code>字段启动的进程为主进程</p>
</li>
<li>
<p>forking：<code>ExecStart</code>字段将以<code>fork()</code>方式启动，此时父进程将会退出，子进程将成为主进程</p>
</li>
<li>
<p>oneshot：类似于<code>simple</code>，但只执行一次，Systemd 会等它执行完，才启动其他服务</p>
</li>
<li>
<p>dbus：类似于<code>simple</code>，但会等待 D-Bus 信号后启动</p>
</li>
<li>
<p>notify：类似于<code>simple</code>，启动结束后会发出通知信号，然后 Systemd 再启动其他服务</p>
</li>
<li>
<p>idle：类似于<code>simple</code>，但是要等到其他任务都执行完，才会启动该服务。一种使用场合是为让该服务的输出，不与其他服务的输出相混合
下面是一个<code>oneshot</code>的例子，笔记本电脑启动时，要把触摸板关掉，配置文件可以这样写。</p>
<p>[Unit]
Description=Switch-off Touchpad</p>
<p>[Service]
Type=oneshot
ExecStart=/usr/bin/touchpad-off</p>
<p>[Install]
WantedBy=multi-user.target
上面的配置文件，启动类型设为<code>oneshot</code>，就表明这个服务只要运行一次就够了，不需要长期运行。</p>
</li>
</ul>
</blockquote>
<p>如果关闭以后，将来某个时候还想打开，配置文件修改如下。</p>
<blockquote>
<pre><code>[Unit]
Description=Switch-off Touchpad

[Service]
Type=oneshot
ExecStart=/usr/bin/touchpad-off start
ExecStop=/usr/bin/touchpad-off stop
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
</code></pre>
</blockquote>
<p>上面配置文件中，<code>RemainAfterExit</code>字段设为<code>yes</code>，表示进程退出以后，服务仍然保持执行。这样的话，一旦使用<code>systemctl stop</code>命令停止服务，<code>ExecStop</code>指定的命令就会执行，从而重新开启触摸板。</p>
<h3 id="63-重启行为">6.3 重启行为</h3>
<p><code>Service</code>区块有一些字段，定义了重启行为。</p>
<blockquote>
<p><code>KillMode</code>字段：定义 Systemd 如何停止 sshd 服务。
上面这个例子中，将<code>KillMode</code>设为<code>process</code>，表示只停止主进程，不停止任何sshd 子进程，即子进程打开的 SSH session 仍然保持连接。这个设置不太常见，但对 sshd 很重要，否则你停止服务的时候，会连自己打开的 SSH session 一起杀掉。</p>
</blockquote>
<p><code>KillMode</code>字段可以设置的值如下。</p>
<blockquote>
<ul>
<li>control-group（默认值）：当前控制组里面的所有子进程，都会被杀掉</li>
<li>process：只杀主进程</li>
<li>mixed：主进程将收到 SIGTERM 信号，子进程收到 SIGKILL 信号</li>
<li>none：没有进程会被杀掉，只是执行服务的 stop 命令。
接下来是<code>Restart</code>字段。
<code>Restart</code>字段：定义了 sshd 退出后，Systemd 的重启方式。
上面的例子中，<code>Restart</code>设为<code>on-failure</code>，表示任何意外的失败，就将重启sshd。如果 sshd 正常停止（比如执行<code>systemctl stop</code>命令），它就不会重启。</li>
</ul>
</blockquote>
<p><code>Restart</code>字段可以设置的值如下。</p>
<blockquote>
<ul>
<li>no（默认值）：退出后不会重启</li>
<li>on-success：只有正常退出时（退出状态码为0），才会重启</li>
<li>on-failure：非正常退出时（退出状态码非0），包括被信号终止和超时，才会重启</li>
<li>on-abnormal：只有被信号终止和超时，才会重启</li>
<li>on-abort：只有在收到没有捕捉到的信号终止时，才会重启</li>
<li>on-watchdog：超时退出，才会重启</li>
<li>always：不管是什么退出原因，总是重启
对于守护进程，推荐设为<code>on-failure</code>。对于那些允许发生错误退出的服务，可以设为<code>on-abnormal</code>。</li>
</ul>
</blockquote>
<p>最后是<code>RestartSec</code>字段。</p>
<blockquote>
<p><code>RestartSec</code>字段：表示 Systemd 重启服务之前，需要等待的秒数。上面的例子设为等待42秒。</p>
</blockquote>
<h2 id="七install-区块">七、[Install] 区块</h2>
<p><code>Install</code>区块，定义如何安装这个配置文件，即怎样做到开机启动。</p>
<blockquote>
<p><code>WantedBy</code>字段：表示该服务所在的 Target。
<code>Target</code>的含义是服务组，表示一组服务。<code>WantedBy=multi-user.target</code>指的是，sshd 所在的 Target 是<code>multi-user.target</code>。</p>
</blockquote>
<p>这个设置非常重要，因为执行<code>systemctl enable sshd.service</code>命令时，<code>sshd.service</code>的一个符号链接，就会放在<code>/etc/systemd/system</code>目录下面的<code>multi-user.target.wants</code>子目录之中。</p>
<p>Systemd 有默认的启动 Target。</p>
<blockquote>
<p>$ systemctl get-default
multi-user.target
上面的结果表示，默认的启动 Target 是<code>multi-user.target</code>。在这个组里的所有服务，都将开机启动。这就是为什么<code>systemctl enable</code>命令能设置开机启动的原因。</p>
</blockquote>
<p>使用 Target 的时候，<code>systemctl list-dependencies</code>命令和<code>systemctl isolate</code>命令也很有用。</p>
<blockquote>
<h3 id="查看-multi-usertarget-包含的所有服务">查看 multi-user.target 包含的所有服务</h3>
<pre><code>$ systemctl list-dependencies multi-user.target

# 切换到另一个 target
# shutdown.target 就是关机状态
$ sudo systemctl isolate shutdown.target
</code></pre>
</blockquote>
<p>一般来说，常用的 Target 有两个：一个是<code>multi-user.target</code>，表示多用户命令行状态；另一个是<code>graphical.target</code>，表示图形用户状态，它依赖于<code>multi-user.target</code>。官方文档有一张非常清晰的 <a href="https://www.freedesktop.org/software/systemd/man/bootup.html#System%20Manager%20Bootup">Target 依赖关系图</a>。</p>
<h2 id="八target-的配置文件">八、Target 的配置文件</h2>
<p>Target 也有自己的配置文件。</p>
<blockquote>
<p>$ systemctl cat multi-user.target</p>
<pre><code>[Unit]
Description=Multi-User System
Documentation=man:systemd.special(7)
Requires=basic.target
Conflicts=rescue.service rescue.target
After=basic.target rescue.service rescue.target
AllowIsolate=yes
</code></pre>
</blockquote>
<p>注意，Target 配置文件里面没有启动命令。</p>
<p>上面输出结果中，主要字段含义如下。</p>
<blockquote>
<p><code>Requires</code>字段：要求<code>basic.target</code>一起运行。</p>
<p><code>Conflicts</code>字段：冲突字段。如果<code>rescue.service</code>或<code>rescue.target</code>正在运行，<code>multi-user.target</code>就不能运行，反之亦然。</p>
<p><code>After</code>：表示<code>multi-user.target</code>在<code>basic.target</code> 、 <code>rescue.service</code>、 <code>rescue.target</code>之后启动，如果它们有启动的话。</p>
<p><code>AllowIsolate</code>：允许使用<code>systemctl isolate</code>命令切换到<code>multi-user.target</code>。</p>
</blockquote>
<h2 id="九修改配置文件后重启">九、修改配置文件后重启</h2>
<p>修改配置文件以后，需要重新加载配置文件，然后重新启动相关服务。</p>
<blockquote>
<h1 id="重新加载配置文件">重新加载配置文件</h1>
<pre><code>$ sudo systemctl daemon-reload&gt; 
# 重启相关服务
$ sudo systemctl restart foobar
</code></pre>
</blockquote>

		</div>
	</div>
</div>


<div class="container">
    
    <div class="row">
        
        <div class="col-5">
            <a class="page-link link-dark text-end dh" href="/post/%E7%8E%A9%E7%8E%A9lfs-%E4%BB%8E%E6%BA%90%E7%A0%81%E6%9E%84%E5%BB%BAlinux%E7%B3%BB%E7%BB%9F/">
                <h5>前一篇</h5><br>
                玩玩LFS-从源码构建Linux系统
            </a>            
        </div>
        
        <div class="col-2">
        </div>
        
        <div class="col-5">
            <a class="page-link link-dark text-start dh" href="/post/sublime%E4%BD%BF%E7%94%A8/">
                <h5>后一篇</h5><br>
                sublime使用
            </a>            
        </div>
        
    </div>
    
</div>

        </div><br><br>
<footer class="container">
    <h2>友情链接</h2>
    <hr>
    <nav class="nav nav-pills flex-column flex-sm-row">
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://wiseai.gitee.io/pages/gnzg/index.html" target="_blank">孤鸟之歌</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://wiseai.gitee.io/pages/mm/index.html" target="_blank">生成随机字符</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://wiseai.gitee.io/pages/md/index.html" target="_blank">MarkDown</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://gitee.com/" target="_blank">Gitee</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://github.com/" target="_blank">Github</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://www.aliyun.com/" target="_blank">阿里云</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://cloud.tencent.com/" target="_blank">腾讯云</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://www.oschina.net/" target="_blank">OSCHINA开源中国</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://gitee.com/wiseai/the-way-to-go_ZH_CN/blob/master/eBook/directory.md" target="_blank">the way to go</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://topgoer.com/" target="_blank">golang文档</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://goframe.org/display/gf" target="_blank">GoFrame</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://www.aliyundrive.com/" target="_blank">阿里云盘</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://cn.vuejs.org/" target="_blank">vue3文档</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://element-plus.gitee.io/zh-CN/" target="_blank">element-plus文档</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://www.runoob.com/vue3/vue3-tutorial.html" target="_blank">vue3菜鸟教程</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://v5.bootcss.com/" target="_blank">bootstrap v5 中文文档</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://www.bootstrap.cn/" target="_blank">bootstrap文档</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://caddy2.dengxiaolong.com/docs/" target="_blank">caddy中文教程</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://www.58pic.com/" target="_blank">千图</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://ifonts.com/" target="_blank">iFonts</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://marketing.qiniu.com/" target="_blank">七牛云</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://www.ixigua.com/" target="_blank">西瓜视频</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://wiseai.gitee.io/pages/yugang/index.html" target="_blank">鱼缸计算</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://justcc.mengkang.net/#/" target="_blank">C语言JustCC</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://wiseai.gitee.io/pages/pptist/" target="_blank">PPTist</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="/index.xml" target="_blank">RSS</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://www.kancloud.cn/idcpj/python/418553" target="_blank">参考资料</a>
        
    </nav>

    <div class="copyright text-center">
      <span class="power-by">
        Powered by <a class="links" href="https://gohugo.io" target="_blank">Hugo</a>
    </span>
    <span>|</span>
    <span>
        Theme - <a class="links" href="https://github.com/wiseai-go/blog-hugo" target="_blank">WiseAI</a>
    </span>
    <br>
    <span class="copyright-year">
        &copy;
        
        2017 -
        2023<span>
            陇ICP备15000157号
            
        </span></span>

</div>
</footer>
<script src="/js/bootstrap.bundle.min.js"></script>


</body>
</html>
